package cn.xy.commons.util;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.text.CharSequenceUtil;

import javax.validation.constraints.NotNull;
import java.util.Date;

/**
 * 断言工具类
 *
 * @author Huang YuHan
 */
public class AssertUtil extends Assert {

    private static final String DATE_NOT_ALLOW_CROSS_MONTH = "时间区间不能跨月";

    /**
     * 检查是否大于某个值
     *
     * @param value            值
     * @param min              最小值
     * @param isEqual          是否相等
     * @param errorMsgTemplate 异常消息
     */
    public static void checkGreatThan(int value, int min, boolean isEqual, String errorMsgTemplate, Object... params) {
        if (isEqual) {
            if (value < min) {
                throw new IllegalArgumentException(CharSequenceUtil.format(errorMsgTemplate, params));
            }
        } else {
            if (value <= min) {
                throw new IllegalArgumentException(CharSequenceUtil.format(errorMsgTemplate, params));
            }
        }
    }

    /**
     * 检查是否小于某个值
     *
     * @param value            值
     * @param max              最大值
     * @param isEqual          是否相等
     * @param errorMsgTemplate 异常消息
     */
    public static void checkLessThan(int value, int max, boolean isEqual, String errorMsgTemplate, Object... params) {
        if (isEqual) {
            if (value > max) {
                throw new IllegalArgumentException(CharSequenceUtil.format(errorMsgTemplate, params));
            }
        } else {
            if (value >= max) {
                throw new IllegalArgumentException(CharSequenceUtil.format(errorMsgTemplate, params));
            }
        }
    }

    /**
     * 检查日期区间是否跨月了
     *
     * @param date1            日期1
     * @param date2            日期2
     * @param errorMsgTemplate 异常消息
     */
    public static void isNotCrossMonth(@NotNull Date date1, @NotNull Date date2, String errorMsgTemplate, Object... params) {
        long date = DateUtil.betweenMonth(date1, date2, true);
        if (date > 0) {
            throw new IllegalArgumentException(CharSequenceUtil.format(errorMsgTemplate != null ? errorMsgTemplate : DATE_NOT_ALLOW_CROSS_MONTH, params));
        }
    }
}
